<?php
/**
 * Created by PhpStorm.
 * User: edmmss
 * Date: 2018/11/13
 * Time: 09:11
 */

namespace app\modules\pool\controller;

use app\modules\pool\WorkerPool;
use yii\web\Controller;

class DefaultController extends Controller
{
    /*
     * 对象池模式示例
     * 是一种提前准备了一组已经初始化了的对象『池』而不是按需创建或者销毁的创建型设计模式。
     * 对象池的客户端会向对象池中请求一个对象，然后使用这个返回的对象执行相关操作。当客户端使用完毕，它将把这个特定类型的工厂对象返回给对象池，而不是销毁掉这个对象。
     * 在初始化实例成本高，实例化率高，可用实例不足的情况下，对象池可以极大地提升性能。在创建对象（尤其是通过网络）时间花销不确定的情况下，
     * 通过对象池在可期时间内就可以获得所需的对象。
     * 无论如何，对象池模式在需要耗时创建对象方面，例如创建数据库连接，套接字连接，线程和大型图形对象（比方字体或位图等），
     * 使用起来都是大有裨益的。在某些情况下，简单的对象池（无外部资源，只占内存）可能效率不高，甚至会有损性能。
     * */

    public function actionMethod1()
    {
        $workerPool = new WorkerPool();
        $worker1 = $workerPool->get();
        $worker2 = $workerPool->get();

        var_dump($worker1 === $worker2);
        var_dump($workerPool);
        var_dump(count($workerPool));

        return true;
    }

    public function actionMethod2()
    {
        $workerPool = new WorkerPool();
        $worker1 = $workerPool->get();
        $workerPool->dispose($worker1);
        $worker2 = $workerPool->get();

        var_dump($worker1 === $worker2);
        var_dump($workerPool);

        return true;
    }
}